﻿using Kaskelot.SP.Core;
using Kaskelot.SP.Model.Client;
using Kaskelot.SP.Model.Client.Forms;
using Microsoft.SharePoint;
using Stockholm.SOA.Kaskelot.WCF.DataContracts;
using System;
using System.Collections.Generic;

namespace Kaskelot.SP.Services.Client.Mapping
{
	public static class ClientByggnadExtensions
	{
		public static ClientByggnad ToClientContract(this Byggnad entity)
		{
			ClientByggnad b = new ClientByggnad();

			CopyFromEntity(entity, b, false);

			return b;
		}

		public static ClientByggnad ToMinimalClientContract(this Byggnad entity)
		{
			ClientByggnad b = new ClientByggnad();

			CopyFromEntity(entity, b, true);

			return b;
		}

		public static Byggnad ToContract(this ClientByggnad b)
		{
			Byggnad entity = new Byggnad();

			CopyToEntity(b, entity);

			return entity;
		}

		public static Byggnad UpdateContract(this Byggnad byggnad, ByggnadDetailsForm form)
		{
			if (byggnad.Id == Guid.Empty)
			{
				byggnad.Id = Guid.NewGuid();
			}
			byggnad.Namn = form.Namn;
			byggnad.Inaktiv = form.Inaktiv;
			byggnad.BesokAdress = form.BesoksAdressRad1;
			byggnad.BesokPostNr = form.BesoksPostNr;
			byggnad.BesokPostOrt = form.BesoksPostOrt;
			byggnad.LeveransAdress = form.LeveransAdressRad1;
			byggnad.LeveransPostNr = form.LeveransPostNr;
			byggnad.LeveransPostOrt = form.LeveransPostOrt;
			byggnad.Fritext = form.Kommentarer;
			byggnad.InformatorKravs = form.InformatorKravs;
			byggnad.KanExpandera = form.KanExpandera;
			byggnad.Koordinater = form.Koordinater;
			byggnad.StadsdelId = form.StadsdelId.IsGuid() ? new Guid(form.StadsdelId) : Guid.Empty;
			byggnad.TypId = form.TypId.IsGuid() ? new Guid(form.TypId) : Guid.Empty;
			byggnad.TelNr = form.TelNr;
			byggnad.Hemsida = form.Hemsida;
			byggnad.Epost = form.Epost;

			byggnad.Andrad = DateTime.Now;
			byggnad.AndradAv = SPContext.Current.Web.CurrentUser.Name;

			return byggnad;
		}

		private static void CopyFromEntity(Byggnad from, ClientByggnad to, bool minimal)
		{
			to.Id = from.Id;
			to.ValId = from.ValId;
			to.Namn = from.Namn;

			to.Aktiv = (!from.Inaktiv).ToJaNej();

			to.Andrad = from.Andrad.HasValue ? from.Andrad.Value.ToShortDateString() : null;
			to.AndradAv = from.AndradAv.ToSharePointFullName();
			to.Skapad = from.Skapad != null ? from.Skapad.ToShortDateString() : null;
			to.SkapadAv = from.SkapadAv.ToSharePointFullName(); ;

			to.BesokAdress = from.BesokAdress;
			to.BesokPostNr = from.BesokPostNr;
			to.BesokPostOrt = from.BesokPostOrt;

			to.LeveransAdress = from.LeveransAdress;
			to.LeveransPostNr = from.LeveransPostNr;
			to.LeveransPostOrt = from.LeveransPostOrt;

			to.StadsdelId = from.StadsdelId;
			to.StadsdelNamn = from.StadsdelNamn;
			to.TypId = from.TypId;
			to.TypNamn = from.TypNamn;

			to.Fritext = from.Fritext;
			to.Koordinater = from.Koordinater;
			to.KanExpandera = from.KanExpandera.ToJaNej(BoolExtensions.Nej);
			to.InformatorKravs = from.InformatorKravs.ToJaNej(BoolExtensions.Nej);

			to.TelNr = from.TelNr;
			to.Hemsida = from.Hemsida.EnsureHTTP();
			to.Epost = from.Epost;

			if (minimal) return;

			if (from.Lokaler != null)
			{
				to.Lokaler = new List<ClientLokal>();
				foreach (Lokal l in from.Lokaler)
				{
					to.Lokaler.Add(l.ToMinimalClientContract());
				}
			}
		}

		private static void CopyToEntity(ClientByggnad from, Byggnad to)
		{
			to.Id = from.Id;
			to.ValId = from.ValId;
			to.Namn = from.Namn;

			to.Inaktiv = !from.Aktiv.FromJaNej();

			if (from.Skapad != null)
				to.Skapad = DateTime.Parse(from.Skapad);

			to.SkapadAv = from.SkapadAv;

			to.BesokAdress = from.BesokAdress;
			to.BesokPostNr = from.BesokPostNr;
			to.BesokPostOrt = from.BesokPostOrt;

			to.LeveransAdress = from.LeveransAdress;
			to.LeveransPostNr = from.LeveransPostNr;
			to.LeveransPostOrt = from.LeveransPostOrt;

			to.Fritext = from.Fritext;
			to.Koordinater = from.Koordinater;
			to.KanExpandera = from.KanExpandera.FromJaNej();
			to.InformatorKravs = from.InformatorKravs.FromJaNej();

			to.TelNr = from.TelNr;
			to.Hemsida = from.Hemsida;
			to.Epost = from.Epost;
		}
	}
}
